﻿// =============================================
// 文件保护宏：防止该头文件被重复包含（避免编译错误）
// 如果尚未定义 CUSTOM_LIT_INPUT_INCLUDED，则定义它并继续，否则跳过该文件的编译
// =============================================
#ifndef CUSTOM_LIT_INPUT_INCLUDED
#define CUSTOM_LIT_INPUT_INCLUDED

// =============================================
// 声明一个 2D 纹理：_BaseMap
// 通常是物体的基础颜色贴图（Albedo / Diffuse Map），提供物体表面的主要颜色信息
// =============================================
TEXTURE2D(_BaseMap);

// =============================================
// 声明一个 2D 纹理：_EmissionMap
// 用于存储物体的自发光颜色信息（RGB），通常用于实现发光材质（如灯光、屏幕、能量体等）
// =============================================
TEXTURE2D(_EmissionMap);

// =============================================
// 声明一个采样器：sampler_BaseMap
// 用于对 _BaseMap（以及 _EmissionMap，当前复用）进行纹理采样
// 注意：这里 _EmissionMap 也复用了 sampler_BaseMap，如果需要更精确控制，也可以为其单独声明采样器
// =============================================
SAMPLER(sampler_BaseMap);

// =============================================
// Unity 的 Instancing 材质属性缓冲区：UnityPerMaterial
// 用于定义 **每个材质实例（或物体）可独立配置的属性**
// 这些属性支持 GPU Instancing，可以在大批量渲染时显著提升性能
// 下面的每个属性都使用了 UNITY_DEFINE_INSTANCED_PROP 宏定义，表示它们是“每实例”的
// =============================================
UNITY_INSTANCING_BUFFER_START(UnityPerMaterial)

	// _BaseMap_ST：基础贴图的 Tiling（缩放）和 Offset（偏移）参数，类型为 float4
	// 格式：(x = scaleX, y = scaleY, z = offsetX, w = offsetY)
	UNITY_DEFINE_INSTANCED_PROP(float4, _BaseMap_ST)

	// _BaseColor：基础颜色（RGBA），用于与 _BaseMap 相乘，控制物体的整体色调
	UNITY_DEFINE_INSTANCED_PROP(float4, _BaseColor)

	// _EmissionColor：自发光颜色（RGBA），用于与 _EmissionMap 相乘，控制发光颜色与强度
	UNITY_DEFINE_INSTANCED_PROP(float4, _EmissionColor)

	// _Cutoff：Alpha 裁剪阈值，范围 [0, 1]，用于控制透明/遮罩物体的裁剪行为
	UNITY_DEFINE_INSTANCED_PROP(float, _Cutoff)

	// _Metallic：金属度（Metallic），范围 [0, 1]，控制 PBR 材质的金属反射特性
	UNITY_DEFINE_INSTANCED_PROP(float, _Metallic)

	// _Smoothness：光滑度（Smoothness），范围 [0, 1]，控制镜面高光的锐利程度
	UNITY_DEFINE_INSTANCED_PROP(float, _Smoothness)

// =============================================
// 结束 UnityPerMaterial 缓冲区的定义
// =============================================
UNITY_INSTANCING_BUFFER_END(UnityPerMaterial)

// =============================================
// 函数：TransformBaseUV
// 作用：对输入的基础 UV 坐标应用 Tiling（缩放）和 Offset（偏移）变换
// 参数：
//   - baseUV：原始的 UV 坐标（通常来自顶点着色器或模型贴图坐标）
// 返回值：变换后的 UV，用于正确采样 _BaseMap 贴图
// =============================================
float2 TransformBaseUV(float2 baseUV) {
	// 从 Instancing 缓冲区中获取当前材质的 _BaseMap_ST 参数
	float4 baseST = UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _BaseMap_ST);
	// 应用 Tiling (xy) 和 Offset (zw)：UV = UV * scale + offset
	return baseUV * baseST.xy + baseST.zw;
}

// =============================================
// 函数：GetBase
// 作用：采样基础贴图 _BaseMap，并与基础颜色 _BaseColor 相乘，得到最终的 Albedo / BaseColor
// 参数：
//   - baseUV：经过 TransformBaseUV 变换后的 UV 坐标
// 返回值：float4，包含基础颜色 RGB 与 Alpha 通道（通常来自贴图或默认 1.0）
// =============================================
float4 GetBase(float2 baseUV) {
	// 从 _BaseMap 贴图中采样颜色，使用 sampler_BaseMap 采样器
	float4 map = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, baseUV);
	// 从 Instancing 缓冲区中获取当前材质的 _BaseColor
	float4 color = UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _BaseColor);
	// 返回：贴图颜色 × 基础颜色，作为最终的 Albedo
	return map * color;
}

// =============================================
// 函数：GetEmission
// 作用：采样自发光贴图 _EmissionMap，并与自发光颜色 _EmissionColor 相乘，得到最终的 Emission 颜色（RGB）
// 参数：
//   - baseUV：基础 UV 坐标（通常与 _BaseMap 相同）
// 返回值：float3，自发光颜色（RGB），用于在后续光照计算或后处理中实现发光效果
// =============================================
float3 GetEmission(float2 baseUV) {
	// 从 _EmissionMap 贴图中采样 RGB 颜色，复用 sampler_BaseMap 采样器
	float4 map = SAMPLE_TEXTURE2D(_EmissionMap, sampler_BaseMap, baseUV);
	// 从 Instancing 缓冲区中获取当前材质的 _EmissionColor
	float4 color = UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _EmissionColor);
	// 返回：贴图 RGB × 自发光颜色 RGB，作为最终的自发光输出
	return map.rgb * color.rgb;
}

// =============================================
// 函数：GetCutoff
// 作用：获取当前材质的 Alpha 裁剪阈值 _Cutoff，用于透明/遮罩材质的裁剪判断
// 参数：
//   - baseUV：UV 坐标（本函数未直接使用，但保持接口一致）
// 返回值：float，范围 [0, 1]，用于 clip() 函数判断是否剔除像素
// =============================================
float GetCutoff(float2 baseUV) {
	return UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _Cutoff);
}

// =============================================
// 函数：GetMetallic
// 作用：获取当前材质的金属度参数 _Metallic，用于 PBR 模型中的金属反射控制
// 参数：
//   - baseUV：UV 坐标（本函数未直接使用，但保持接口一致）
// 返回值：float，范围 [0, 1]
// =============================================
float GetMetallic(float2 baseUV) {
	return UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _Metallic);
}

// =============================================
// 函数：GetSmoothness
// 作用：获取当前材质的光滑度参数 _Smoothness，用于控制镜面高光的锐利程度
// 参数：
//   - baseUV：UV 坐标（本函数未直接使用，但保持接口一致）
// 返回值：float，范围 [0, 1]
// =============================================
float GetSmoothness(float2 baseUV) {
	return UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _Smoothness);
}

// =============================================
// 文件保护宏结束
// =============================================
#endif